gtk_check_button_new
gtk_check_button_new_with_label
gtk_check_button_new_with_mnemonic
+gtk_check_button_get_draw_indicator
+gtk_check_button_set_draw_indicator
<SUBSECTION Standard>
GTK_CHECK_BUTTON
GTK_IS_CHECK_BUTTON
gtk_toggle_button_new
gtk_toggle_button_new_with_label
gtk_toggle_button_new_with_mnemonic
-gtk_toggle_button_set_mode
-gtk_toggle_button_get_mode
gtk_toggle_button_toggled
gtk_toggle_button_get_active
gtk_toggle_button_set_active
* ╰── <child>
* ]|
*
- * A GtkCheckButton with indicator (see gtk_toggle_button_set_mode()) has a
+ * A GtkCheckButton with indicator (see gtk_check_button_set_draw_indicator()) has a
* main CSS node with name checkbutton and a subnode with name check.
*
* |[<!-- language="plain" -->
typedef struct {
GtkCssGadget *gadget;
GtkCssGadget *indicator_gadget;
+
+ guint draw_indicator : 1;
} GtkCheckButtonPrivate;
+enum {
+ PROP_0,
+ PROP_DRAW_INDICATOR,
+ NUM_PROPERTIES
+};
+
+static GParamSpec *props[NUM_PROPERTIES] = { NULL, };
+
G_DEFINE_TYPE_WITH_PRIVATE (GtkCheckButton, gtk_check_button, GTK_TYPE_TOGGLE_BUTTON)
+
static void
gtk_check_button_update_node_state (GtkWidget *widget)
{
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
GtkCssGadget *gadget;
- if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+ if (priv->draw_indicator)
gadget = priv->gadget;
else
gadget = GTK_BUTTON (widget)->priv->gadget;
minimum_baseline, natural_baseline);
}
+static void
+gtk_check_button_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id)
+ {
+ case PROP_DRAW_INDICATOR:
+ gtk_check_button_set_draw_indicator (GTK_CHECK_BUTTON (object),
+ g_value_get_boolean (value));
+
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+gtk_check_button_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id)
+ {
+ case PROP_DRAW_INDICATOR:
+ g_value_set_boolean (value, gtk_check_button_get_draw_indicator (GTK_CHECK_BUTTON (object)));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
static void
gtk_check_button_class_init (GtkCheckButtonClass *class)
{
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
object_class->finalize = gtk_check_button_finalize;
+ object_class->set_property = gtk_check_button_set_property;
+ object_class->get_property = gtk_check_button_get_property;
widget_class->measure = gtk_check_button_measure;
widget_class->size_allocate = gtk_check_button_size_allocate;
container_class->add = gtk_check_button_add;
container_class->remove = gtk_check_button_remove;
+ props[PROP_DRAW_INDICATOR] =
+ g_param_spec_boolean ("draw-indicator",
+ P_("Draw Indicator"),
+ P_("If the indicator part of the button is displayed"),
+ TRUE,
+ GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
+ g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
+
gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_CHECK_BOX);
gtk_widget_class_set_css_name (widget_class, "checkbutton");
}
static void
-draw_indicator_changed (GObject *object,
- GParamSpec *pspec,
- gpointer user_data)
+draw_indicator_changed (GtkCheckButton *check_button)
{
- GtkButton *button = GTK_BUTTON (object);
- GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (button));
+ GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);
GtkCssNode *widget_node;
GtkCssNode *indicator_node;
- widget_node = gtk_widget_get_css_node (GTK_WIDGET (button));
+ widget_node = gtk_widget_get_css_node (GTK_WIDGET (check_button));
indicator_node = gtk_css_gadget_get_node (priv->indicator_gadget);
- if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (button)))
+ if (priv->draw_indicator)
{
gtk_css_node_set_visible (indicator_node, TRUE);
- if (GTK_IS_RADIO_BUTTON (button))
+ if (GTK_IS_RADIO_BUTTON (check_button))
{
gtk_css_node_remove_class (widget_node, g_quark_from_static_string ("radio"));
gtk_css_node_set_name (widget_node, I_("radiobutton"));
}
- else if (GTK_IS_CHECK_BUTTON (button))
+ else if (GTK_IS_CHECK_BUTTON (check_button))
{
gtk_css_node_remove_class (widget_node, g_quark_from_static_string ("check"));
gtk_css_node_set_name (widget_node, I_("checkbutton"));
else
{
gtk_css_node_set_visible (indicator_node, FALSE);
- if (GTK_IS_RADIO_BUTTON (button))
+ if (GTK_IS_RADIO_BUTTON (check_button))
{
gtk_css_node_add_class (widget_node, g_quark_from_static_string ("radio"));
gtk_css_node_set_name (widget_node, I_("button"));
}
- else if (GTK_IS_CHECK_BUTTON (button))
+ else if (GTK_IS_CHECK_BUTTON (check_button))
{
gtk_css_node_add_class (widget_node, g_quark_from_static_string ("check"));
gtk_css_node_set_name (widget_node, I_("button"));
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);
GtkCssNode *widget_node;
+ priv->draw_indicator = TRUE;
+
gtk_widget_set_receives_default (GTK_WIDGET (check_button), FALSE);
- g_signal_connect (check_button, "notify::draw-indicator", G_CALLBACK (draw_indicator_changed), NULL);
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (check_button), TRUE);
gtk_style_context_remove_class (gtk_widget_get_style_context (GTK_WIDGET (check_button)), "toggle");
PangoContext *pango_context;
PangoFontMetrics *metrics;
- if (gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+ if (priv->draw_indicator)
gadget = priv->gadget;
else
gadget = button->priv->gadget;
{
GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (GTK_CHECK_BUTTON (widget));
- if (!gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+ if (!priv->draw_indicator)
GTK_WIDGET_CLASS (gtk_check_button_parent_class)->snapshot (widget, snapshot);
else
gtk_css_gadget_snapshot (priv->gadget, snapshot);
return gtk_css_gadget_get_node (priv->indicator_gadget);
}
+
+/**
+ * gtk_check_button_set_draw_indicator:
+ * @check_button: a #GtkCheckButton
+ * @draw_indicator: Whether or not to draw the indicator part of the button
+ *
+ * Sets whether the indicator part of the button is drawn. This is important for
+ * cases where the check button should have the functinality of a check button,
+ * but the visuals of a regular button, like in a #GtkStackSwitcher.
+ */
+void
+gtk_check_button_set_draw_indicator (GtkCheckButton *check_button,
+ gboolean draw_indicator)
+{
+ GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);
+
+ g_return_if_fail (GTK_IS_CHECK_BUTTON (check_button));
+
+ draw_indicator = !!draw_indicator;
+
+ if (draw_indicator != priv->draw_indicator)
+ {
+ priv->draw_indicator = draw_indicator;
+ draw_indicator_changed (check_button);
+ gtk_widget_queue_resize (GTK_WIDGET (check_button));
+ g_object_notify_by_pspec (G_OBJECT (check_button), props[PROP_DRAW_INDICATOR]);
+ }
+}
+
+/**
+ * gtk_check_button_get_draw_indicator:
+ * @check_button: a #GtkCheckButton
+ *
+ * Returns Whether or not the indicator part of the button gets drawn.
+ *
+ * Returns: The value of the GtkCheckButton:draw-indicator property.
+ */
+gboolean
+gtk_check_button_get_draw_indicator (GtkCheckButton *check_button)
+{
+ GtkCheckButtonPrivate *priv = gtk_check_button_get_instance_private (check_button);
+
+ g_return_val_if_fail (GTK_IS_CHECK_BUTTON (check_button), FALSE);
+
+ return priv->draw_indicator;
+}
GtkWidget* gtk_check_button_new_with_label (const gchar *label);
GDK_AVAILABLE_IN_ALL
GtkWidget* gtk_check_button_new_with_mnemonic (const gchar *label);
+GDK_AVAILABLE_IN_3_90
+void gtk_check_button_set_draw_indicator (GtkCheckButton *check_button,
+ gboolean draw_indicator);
+GDK_AVAILABLE_IN_3_90
+gboolean gtk_check_button_get_draw_indicator (GtkCheckButton *check_button);
G_END_DECLS
* ╰── <child>
* ]|
*
- * A GtkRadioButton with indicator (see gtk_toggle_button_set_mode()) has a
+ * A GtkRadioButton with indicator (see gtk_check_button_set_draw_indicator())) has a
* main CSS node with name radiobutton and a subnode with name radio.
*
* |[<!-- language="plain" -->
/* Radio buttons with draw_indicator unset focus "normally", since
* they look like buttons to the user.
*/
- if (!gtk_toggle_button_get_mode (GTK_TOGGLE_BUTTON (widget)))
+ if (!gtk_check_button_get_draw_indicator (GTK_CHECK_BUTTON (widget)))
return GTK_WIDGET_CLASS (gtk_radio_button_parent_class)->focus (widget, direction);
if (gtk_widget_is_focus (widget))
gtk_radio_tool_button_init (GtkRadioToolButton *button)
{
GtkToolButton *tool_button = GTK_TOOL_BUTTON (button);
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (_gtk_tool_button_get_button (tool_button)), FALSE);
+ gtk_check_button_set_draw_indicator (GTK_CHECK_BUTTON (_gtk_tool_button_get_button (tool_button)), FALSE);
}
static void
button = gtk_radio_button_new (NULL);
gtk_widget_set_focus_on_click (button, FALSE);
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
+ gtk_check_button_set_draw_indicator (GTK_CHECK_BUTTON (button), FALSE);
update_button (self, widget, button);
* text = "Hi, i’m a toggle button.";
* toggle1 = gtk_toggle_button_new_with_label (text);
*
- * // Makes this toggle button invisible
- * gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (toggle1),
- * TRUE);
- *
* g_signal_connect (toggle1, "toggled",
* G_CALLBACK (output_state),
* NULL);
*
* text = "Hi, i’m a toggle button.";
* toggle2 = gtk_toggle_button_new_with_label (text);
- * gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (toggle2),
- * FALSE);
* g_signal_connect (toggle2, "toggled",
* G_CALLBACK (output_state),
* NULL);
struct _GtkToggleButtonPrivate
{
guint active : 1;
- guint draw_indicator : 1;
guint inconsistent : 1;
};
PROP_0,
PROP_ACTIVE,
PROP_INCONSISTENT,
- PROP_DRAW_INDICATOR,
NUM_PROPERTIES
};
FALSE,
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
- toggle_button_props[PROP_DRAW_INDICATOR] =
- g_param_spec_boolean ("draw-indicator",
- P_("Draw Indicator"),
- P_("If the toggle part of the button is displayed"),
- FALSE,
- GTK_PARAM_READWRITE);
-
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, toggle_button_props);
/**
toggle_button->priv = gtk_toggle_button_get_instance_private (toggle_button);
toggle_button->priv->active = FALSE;
- toggle_button->priv->draw_indicator = FALSE;
context = gtk_widget_get_style_context (GTK_WIDGET (toggle_button));
gtk_style_context_add_class (context, "toggle");
case PROP_INCONSISTENT:
gtk_toggle_button_set_inconsistent (tb, g_value_get_boolean (value));
break;
- case PROP_DRAW_INDICATOR:
- gtk_toggle_button_set_mode (tb, g_value_get_boolean (value));
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_INCONSISTENT:
g_value_set_boolean (value, priv->inconsistent);
break;
- case PROP_DRAW_INDICATOR:
- g_value_set_boolean (value, priv->draw_indicator);
- break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
-/**
- * gtk_toggle_button_set_mode:
- * @toggle_button: a #GtkToggleButton
- * @draw_indicator: if %TRUE, draw the button as a separate indicator
- * and label; if %FALSE, draw the button like a normal button
- *
- * Sets whether the button is displayed as a separate indicator and label.
- * You can call this function on a checkbutton or a radiobutton with
- * @draw_indicator = %FALSE to make the button look like a normal button.
- *
- * This can be used to create linked strip of buttons that work like
- * a #GtkStackSwitcher.
- *
- * This function only affects instances of classes like #GtkCheckButton
- * and #GtkRadioButton that derive from #GtkToggleButton,
- * not instances of #GtkToggleButton itself.
- */
-void
-gtk_toggle_button_set_mode (GtkToggleButton *toggle_button,
- gboolean draw_indicator)
-{
- GtkToggleButtonPrivate *priv;
-
- g_return_if_fail (GTK_IS_TOGGLE_BUTTON (toggle_button));
-
- priv = toggle_button->priv;
-
- draw_indicator = draw_indicator ? TRUE : FALSE;
-
- if (priv->draw_indicator != draw_indicator)
- {
- priv->draw_indicator = draw_indicator;
-
- if (gtk_widget_get_visible (GTK_WIDGET (toggle_button)))
- gtk_widget_queue_resize (GTK_WIDGET (toggle_button));
-
- g_object_notify_by_pspec (G_OBJECT (toggle_button), toggle_button_props[PROP_DRAW_INDICATOR]);
- }
-}
-
-/**
- * gtk_toggle_button_get_mode:
- * @toggle_button: a #GtkToggleButton
- *
- * Retrieves whether the button is displayed as a separate indicator
- * and label. See gtk_toggle_button_set_mode().
- *
- * Returns: %TRUE if the togglebutton is drawn as a separate indicator
- * and label.
- **/
-gboolean
-gtk_toggle_button_get_mode (GtkToggleButton *toggle_button)
-{
- g_return_val_if_fail (GTK_IS_TOGGLE_BUTTON (toggle_button), FALSE);
-
- return toggle_button->priv->draw_indicator;
-}
-
/**
* gtk_toggle_button_set_active:
* @toggle_button: a #GtkToggleButton.
GDK_AVAILABLE_IN_ALL
GtkWidget* gtk_toggle_button_new_with_mnemonic (const gchar *label);
GDK_AVAILABLE_IN_ALL
-void gtk_toggle_button_set_mode (GtkToggleButton *toggle_button,
- gboolean draw_indicator);
-GDK_AVAILABLE_IN_ALL
-gboolean gtk_toggle_button_get_mode (GtkToggleButton *toggle_button);
-GDK_AVAILABLE_IN_ALL
void gtk_toggle_button_set_active (GtkToggleButton *toggle_button,
gboolean is_active);
GDK_AVAILABLE_IN_ALL
gtk_container_add (GTK_CONTAINER (hbox), button);
button = gtk_toggle_button_new_with_label ("│Xyj,Ö");
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), TRUE);
if (j == 0)
gtk_widget_set_valign (button, GTK_ALIGN_BASELINE);
gtk_container_add (GTK_CONTAINER (hbox), button);
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE);
button = gtk_radio_button_new_with_label (NULL, "button4");
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
+ gtk_check_button_set_draw_indicator (GTK_CHECK_BUTTON (button), FALSE);
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE);
button = gtk_radio_button_new_with_label (
gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
"button5");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), TRUE);
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
+ gtk_check_button_set_draw_indicator (GTK_CHECK_BUTTON (button), FALSE);
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE);
button = gtk_radio_button_new_with_label (
gtk_radio_button_get_group (GTK_RADIO_BUTTON (button)),
"button6");
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button), FALSE);
+ gtk_check_button_set_draw_indicator (GTK_CHECK_BUTTON (button), FALSE);
gtk_box_pack_start (GTK_BOX (box2), button, TRUE, TRUE);
separator = gtk_separator_new (GTK_ORIENTATION_HORIZONTAL);